<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>函数-默认参数</title>
</head>
<body>
  
</body>
<script>
  // undefined
  function func(name = "strick") {
    console.log(name)
    return name
  }

  func(undefined)   // "strick"
  func(false)       // false
  func(null)        // null

  // 位置
  // 可以位于普通参数之前，也可以位于之后
  function func1(name = "strick", age) {
    console.log(name)
    return name
  }

  function func2(name, age=28) {
    console.log(age)
    return age
  }

  func1(undefined)  // "strick"
  func2("strick")   // 28

  // 默认值
  // 可以使简单的字面量，也可以是复杂的表达式
  function expression1(name, full = "pre" + name) {
    console.log(name, full)
  }

  expression1("strick")

  function expression2(name = full, full) {
    console.log(name, full)
  }

  // expression2(undefined, "freedom") // 报错 name取默认值， 使用let声明，出现临时死区。此时full没有被声明，所以报错。


  /* 
    限制
      不出现同名参数
      function restrict1(name = "strick", name) {}

      不能在函数体中使用let或者const对参数进行重新声明
      function restrict2(name = "strick") {
        let name = "freedom"
      }
  */

  /* 
    三个作用域
      函数体内可以修改参数的值，但不能为其重新声明
      参数作用域可以访问外层作用域中的变量，但不能访问函数体内的变量
  */

  let full = "freedom"
  function scope1(name = full) {
    console.log(name)
  }

  scope1()

  function scope2(name = en) {
    let en = "justify"
    console.log(name)
  }

  // scope2()    // 报错 en is not defined 不能访问函数体内的变量

  let name = "freedom"

  function scope3(name = name) {    // 此处参数作用域中 name 被let声明，出现临时死区，找不到对应的值，所以报错
    console.log(name)
  }

  scope3()                          // 报错 Cannot access 'name' before initialization
  


  



  
</script>
</html>